#include "setprioridades.h"
#include "ui_setprioridades.h"

#define COMPCRTS "Criterios vs Criterios"

#include <iostream>

using namespace std;

setPrioridades::setPrioridades(QWidget *parent, AHP * ahp) :
    QDialog(parent),
    ui(new Ui::setPrioridades)
{
    ui->setupUi(this);
    this->ahp=ahp;
    alternativas = ahp->getAlternativas();
    criterios = ahp->getCriterios();

    QString c;
    ui->comboBox->addItem(COMPCRTS);
    for (list<string>::iterator criterio = criterios.begin(); criterio!=criterios.end(); criterio++){
        c = criterio->c_str();
        ui->comboBox->addItem(c);
    }

    this->on_comboBox_activated(0);

}

setPrioridades::~setPrioridades()
{
    delete ui;
}


void setPrioridades::on_comboBox_activated(int index)
{
    for(int j=ui->tableWidget->rowCount()-1;j>=0;j--){
        ui->tableWidget->removeColumn(j);
        ui->tableWidget->removeRow(j);
    }

    QTableWidgetItem *newItem;


    int i=0;//contador fila
    if (index == 0){  //si eligio la primera opción (comparacion entre criterios)
        //Creo la tabla con todas sus celdas(sin importar el nombre ni nada), esto es debido a que si se carga a medida que va
        //avanzando el iterador, cuando se quieran cargar elementos de una fila no hay columnas en donde poner esos elementos
        for(int k=0;k<criterios.size();k++){
            ui->tableWidget->insertRow(ui->tableWidget->rowCount());
            ui->tableWidget->insertColumn(ui->tableWidget->columnCount());
        }
        for (list<string>::iterator criterio = criterios.begin(); criterio!=criterios.end();criterio++){
            //agregar los encabezados correspondientes para comparar entre pares
            ui->tableWidget->setHorizontalHeaderItem(i,new QTableWidgetItem(QString(criterio->c_str())));
            ui->tableWidget->setVerticalHeaderItem(i,new QTableWidgetItem(QString(criterio->c_str())));

            int j=0;//contador columna
            //Lleno toda la fila con los elementos almacenados en el ahp
            for (list<string>::iterator criterio2 = criterios.begin(); criterio2!=criterios.end();criterio2++){
                if(i==j){//insertar en la diagonal el valor 1 (igual importancia)
                    newItem = new QTableWidgetItem(QString("1"));
                    newItem->setFlags(newItem->flags() & (Qt::ItemIsEditable));
                    ui->tableWidget->setItem(i,j,newItem);
                } else {//insertar en la posicion i,j el valor cargado en this->ahp
                    newItem = new QTableWidgetItem(QString::number(this->ahp->getComparacionCriterios(*criterio,*criterio2)));
                    ui->tableWidget->setItem(i,j,newItem);
                }
                j++;

            }
            i++;

        };
    }
   else{  //comparación de entre pares de alternativas segun el criterio elegido
        //Idem el otro caso del if
        for(int k=0;k<alternativas.size();k++){
            ui->tableWidget->insertRow(ui->tableWidget->rowCount());
            ui->tableWidget->insertColumn(ui->tableWidget->columnCount());
        }
        for (list<string>::iterator alternativa = alternativas.begin(); alternativa!=alternativas.end();alternativa++){
            //agregar los encabezados correspondientes para comparar entre pares
            ui->tableWidget->setHorizontalHeaderItem(i,new QTableWidgetItem(QString(alternativa->c_str())));
            ui->tableWidget->setVerticalHeaderItem(i,new QTableWidgetItem(QString(alternativa->c_str())));

            int j=0;//contador columna
            //Lleno toda la fila con los elementos almacenados en el ahp
            for (list<string>::iterator alternativa2 = alternativas.begin(); alternativa2!=alternativas.end();alternativa2++){
                if(i==j){//insertar en la diagonal el valor 1 (igual importancia)
                    newItem = new QTableWidgetItem(QString("1"));
                    newItem->setFlags(newItem->flags() & (Qt::ItemIsEditable));
                    ui->tableWidget->setItem(i,j,newItem);
                } else {//insertar en la posicion i,j el valor cargado en this->ahp
                    newItem = new QTableWidgetItem(QString::number(this->ahp->getComparacionAlternativas(ui->comboBox->currentText().toStdString(),*alternativa,*alternativa2)));
                    ui->tableWidget->setItem(i,j,newItem);
                }
                j++;
            }
            i++;
        };

    }

}

void setPrioridades::on_tableWidget_itemChanged(QTableWidgetItem* item)
{
    if (this->selectedItem==item){
        this->selectedItem=0;   //Esto lo hago por que como QTableWidget trabaja con observadores, la funcion changed
                                //se activa cada ves que el observador nota un cambio, y como dentro de la misma funcion
                                //changed se modifica la tabla, si no lo corto de alguna forma entraria en un bucle infinito
                                //Por eso se setea el valor del item clickeado en la otra funcion
        int row=ui->tableWidget->row(item);
        int column=ui->tableWidget->column(item);
        bool check;
        float value = item->text().toFloat(&check);
        if (!check)  //el usuario no ingresó un número
            item->setText(this->lastValue);
        else
            if ((value < 0) || (value > 9)) //el usuario ingresó un valor fuera de la escala de Saaty
                item->setText(this->lastValue);
            else{
                float invValue=1/value; //Calculo el valor de la celda opuesta(lo dejo como float, no como fraccion)
                //ingresar el recíproco en la celda opuesta
                QTableWidgetItem * newItem = new QTableWidgetItem(QString::number(invValue));
                ui->tableWidget->setItem(column,row,newItem);

                string o1 = ui->tableWidget->horizontalHeaderItem(ui->tableWidget->currentColumn())->text().toStdString();
                string o2 = ui->tableWidget->verticalHeaderItem(ui->tableWidget->currentRow())->text().toStdString();

                if (ui->comboBox->currentIndex()==0){ //cargar comparacion entre criterios
                    //seteo los valores del ahp correspondientes(el ingresado y el opuesto)
                    ahp->setComparacionCriterios(o1,o2,value);
                }
                else{  //cargar comparacion entre pares de alternativas segun el criterio seleccionado
                    //seteo los valores del ahp correspondientes(el ingresado y el opuesto)
                    string criterio = ui->comboBox->currentText().toStdString();
                    ahp->setComparacionAlternativas(criterio,o1,o2,value);
                }
            };
    }

}

void setPrioridades::on_tableWidget_itemClicked(QTableWidgetItem* item)
{
    this->lastValue = item->text();
    this->selectedItem = item;
}

void setPrioridades::on_pushButton_3_clicked()
{
    this->accept();
}
